package main

import (
	"fmt"
)

type cb func(int) int

func main() {
	/* 定义局部变量 */
	x, y := 10, 20
	fmt.Printf("Before:\n\tx: %d\ty: %d\n", x, y)
	x, y = swap_v(x, y)
	fmt.Printf("After:\n\tx: %d\ty: %d\n", x, y)

	x, y = 10, 20
	fmt.Printf("Before:\n\tx: %d\ty: %d\n", x, y)
	/* 调用swap()函数，引用传递
	* &x 指向 x 指针，x 变量的地址
	* &y 指向 y 指针，y 变量的地址
	 */
	swap(&x, &y)
	fmt.Printf("After:\n\tx: %d\ty: %d\n", x, y)

	/* 正方形求周长、面积
	* getPerimeter(): 正方行求周长
	* getArea(): 正方形求面积
	 */
	var side int = 5
	getPerimeter := func(x int) int {
		return x * 4
	}

	getArea := func(x int) int {
		return x * x
	}

	fmt.Printf("side:%d\tperimeter:%d\tarea:%d\n", side, getPerimeter(side), getArea(side))

	fmt.Printf("函数作为参数传递：%d\n", square_getArea(4, getArea))
}

// 函数参数 值传递（将参数的值传递到函数中）
func swap_v(x, y int) (int, int) {
	// temp := x
	// x = y
	// y = temp
	x, y = y, x
	return x, y
}

// 函数参数 引用传递（将参数的地址传递到函数中）
func swap(x, y *int) {
	*x, *y = *y, *x
}

func square_getArea(x int, f cb) int {
	return f(x)
}
